package com.zhuangjie.mvc.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.zhuangjie.idworker.helper.SnowflakeHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.time.LocalDateTime;
/**
 * 公共mybatis-plus配置注册到IOC
 */
@Configuration
// ** 与*是有区别的，*不可以跨点/包，**可以 , 不要写为com.**.mapper这样范围太大了，在引入wx JDK就会有问题，将wxJava包的mapper也注册了
@MapperScan("com.zhuangjie.**.mapper")
public class MyBatisPlusConfig {
    /**
     * 雪花助手（分布式id生成）
     */
    @Autowired
    private SnowflakeHelper snowflakeHelper;

    @Bean
    @Primary  // 添加此行可解决此配置不在服务模块而出现的Bean重复，作用是表示在同类型的多个 Bean 中，优先选择用 @Primary 注解的 Bean。
    public IdentifierGenerator customIdGenerator() {
        return new CustomIdGenerator(snowflakeHelper);
    }
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        return new PagingConfig().mybatisPlusInterceptor();
    }
    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new MyMetaObjectHandler();
    }

}

/**
 * 分页插件配置
 * @author zhuangjie
 * @date 2023/09/24
 */
class PagingConfig {
    /**
     * 分页插件
     * @return
     */
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     */
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

/**
 * 自定义id生成器
 * @author zhuangjie
 */

class CustomIdGenerator implements IdentifierGenerator {

    /**
     * 雪花助手（分布式id生成）
     */
    private SnowflakeHelper snowflakeHelper;

    public CustomIdGenerator(SnowflakeHelper snowflakeHelper) {
        this.snowflakeHelper = snowflakeHelper;
    }

    @Override
    public Long nextId(Object entity) {
        return snowflakeHelper.nextId();
//        //可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
//        int max = 999;
//        String characters = String.valueOf( (int)(Math.random()  * (max+1)));
//        String tail = Covering(characters,4);
//        return Long.valueOf(System.currentTimeMillis() + tail);
    }

//    public String Covering(Object base,int desireLength) {
//        StringBuilder result = new StringBuilder(base.toString());
//        int  complementNumber = desireLength - result.length();
//        for (int i = 0; i < complementNumber; i++) {
//            result.append("0");
//        }
//        return result.toString();
//    }

}

/**
 * 插入字段自动填充
 * @author zhuangjie
 * @date 2023/09/24
 */
@Slf4j
/** 一定不要忘记把处理器加到IOC容器中！ **/
class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入时的填充策略
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill.....");
        // setFieldValByName(String fieldName, Object fieldVal, MetaObject
        System.out.println(metaObject);
        this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);
        this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
        // 填充逻辑删除字段
        this.setFieldValByName("deleted", 0,metaObject);
    }

    /**
     * 更新时的填充策略
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill.....");
        this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
    }
}